/***************************************************************************************************
                                项目                :       GimKeyboard
                                处理器				:       ESP32-S3
                                开发环境			:       pio(Arduino)
                                文件				:       led_ws2812b_drv.cpp
                                说明				:       ws2812b灯珠驱动
                                作者				:       金欣嵘
====================================================================================================

====================================================================================================
                                               修改记录 
====================================================================================================
----------------------------------------------------------------------------------------------------
                                               2023.05.22
----------------------------------------------------------------------------------------------------
                            修改人                  :            金欣嵘
                            修改记录                :            创建文件 
----------------------------------------------------------------------------------------------------
***************************************************************************************************/
#include "../inc/led_ws2812b_drv.h"
#include "../../hc165_keyboard_matrix_drv/inc/hc165_keyboard_matrix_drv.h"

#define LED_COLOR_PIPE_MAX_VALUE        255
#define LED_INIT_COLOR_VALUE            LED_COLOR_PIPE_MAX_VALUE

TaskHandle_t Led2812bDrv::led_2812b_task_handler = nullptr;
Adafruit_NeoPixel Led2812bDrv::strip = Adafruit_NeoPixel(WS2812B_NUM, WS2812B_CTRL_PIN, NEO_GRB + NEO_KHZ800);
uint8_t Led2812bDrv::color_matrix[WS2812B_COLOR_PIPE_NUM][WS2812B_NUM] = {0};

/***************************************************************************************************
  * @函数名称 : init
  * @函数功能 : 初始化led任务
***************************************************************************************************/
void Led2812bDrv::init(void)
{
    xTaskCreate(start_led2812b_task,
    "led2812bTask",
    LED_DRV_STACK_SIZE,
    NULL,
    LED_DRV_TASK_PRIO,
    &led_2812b_task_handler);
}

/***************************************************************************************************
  * @函数名称 : fill_graphics_memory_as_pipe
  * @输入参数 : color_pipe：通道；value：值
  * @函数功能 : 根据通道填充显存函数
***************************************************************************************************/
void Led2812bDrv::fill_graphics_memory_as_pipe(uint8_t color_pipe, uint8_t value)
{
    if (color_pipe >= WS2812B_COLOR_PIPE_NUM)
    {
        return;
    }

    for (uint16_t i = 0; i < WS2812B_NUM; i ++)
    {
        color_matrix[color_pipe][i] = value;
    }
}

/***************************************************************************************************
  * @函数名称 : set_color_as_stepr
  * @输入参数 : color_pipe：通道r；step：步长；direction：方向
  * @函数功能 : 根据步长调整通道
***************************************************************************************************/
void Led2812bDrv::set_color_as_step(uint8_t color_pipe, uint8_t step, uint8_t direction)
{
    static uint8_t value[WS2812B_COLOR_PIPE_NUM] = {0};
    if (direction == COLOR_CHANGE_DIRECTION_UP)
    {
        if (value[color_pipe] + step < LED_COLOR_PIPE_MAX_VALUE)
        {
            value[color_pipe] = value[color_pipe] + step;
        }
        else
        {
            value[color_pipe] = LED_COLOR_PIPE_MAX_VALUE;
        }
    }
    else if (direction == COLOR_CHANGE_DIRECTION_DOWN)
    {       
        if (value[color_pipe] - step > 0)
        {
            value[color_pipe] = value[color_pipe] - step;
        }
        else
        {
            value[color_pipe] = 0;
        }
    }
    else
    {
        return;
    }
    
    fill_graphics_memory_as_pipe(color_pipe, value[color_pipe]);
}

/***************************************************************************************************
  * @函数名称 : set_brightness
  * @输入参数 : brightness：亮度值（0-255）
  * @函数功能 : 设置亮度
***************************************************************************************************/
void Led2812bDrv::set_brightness(uint8_t set_brightness)
{
    strip.setBrightness(set_brightness);
}

/***************************************************************************************************
  * @函数名称 : start_led2812b_task
  * @输入参数 : pvParameters：任务服务函数的参数（未使用）
  * @输出参数 : 无
  * @函数返回 : 无
  * @函数功能 : 任务服务函数
***************************************************************************************************/
void Led2812bDrv::start_led2812b_task(void *pvParameters)
{
#if LED_WS2812B_DEBUG
    printf("==============ws2812b task is running!============\r\n");
#endif

    strip.begin();
    set_brightness(10);

    for(;;)
    {
        for (uint16_t i = 0; i < WS2812B_NUM; i ++)
        {
            strip.setPixelColor(i, strip.Color(color_matrix[WS2812B_COLOR_PIPE_R][i], color_matrix[WS2812B_COLOR_PIPE_G][i], color_matrix[WS2812B_COLOR_PIPE_B][i]));
        }
        strip.show();
        strip.show();
        vTaskDelay(50);
    }

#if LED_WS2812B_DEBUG
    printf("================ws2812b task is end!==============\r\n");
#endif
}

Led2812bDrv led_2812b_drv;
